<!DOCTYPE html>
<!--

// Copyright 2011 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

-->
<html>
<head>
<title></title>
<script src="../../../third_party/closure-library/closure/goog/base.js"></script>
<script>

goog.require('goog.testing.jsunit');

</script>
<script src="../../../src/traceur.js"></script>
</head>
<body>
<script>

var VariableBinder = traceur.semantics.VariableBinder;
var Parser = traceur.syntax.Parser;
var SourceFile = traceur.syntax.SourceFile;
var ErrorReporter = traceur.util.ErrorReporter;

function parse(code) {
  var errors = new ErrorReporter();
  var tree = new Parser(errors, new SourceFile('inline', code)).parseProgram();
  assertFalse(errors.hadError());
  assertEquals(1, tree.programElements.length);
  return tree.programElements[0];
}

function idsToString(identifiers) {
  return Object.keys(identifiers).sort().join(',');
}

function testBoundIdentifiersInBlock() {
  assertEquals('f', idsToString(VariableBinder.variablesInBlock(parse(
      '{ function f(x) { var y; }; }'), false)));
  assertEquals('', idsToString(VariableBinder.variablesInBlock(parse(
      '{ var x = function f() {}; }'), false)));
  assertEquals('x', idsToString(VariableBinder.variablesInBlock(parse(
      '{ let x = function f() {}; }'), false)));

  // Now set includeFunctionScope = true
  assertEquals('f', idsToString(VariableBinder.variablesInBlock(parse(
      '{ function f(x) { var y; }; }'), true)));
  assertEquals('x', idsToString(VariableBinder.variablesInBlock(parse(
      '{ var x = function f() {}; }'), true)));
}

function testBoundIdentifiersInFunction() {
  assertEquals('x,y', idsToString(VariableBinder.variablesInFunction(parse(
      'function f(x) { var y; f(); }'))));
  assertEquals('', idsToString(VariableBinder.variablesInFunction(parse(
      'function f() { try { } catch (x) { function g(y) { } } }'))));
}

</script>
</body>
</html>
